package com.closer.server.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import com.closer.server.support.exception.ErrorCode;
import com.closer.server.support.exception.ThrowUtils;
import jakarta.annotation.PostConstruct;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

    @PostConstruct
    public void init() {
        System.out.println("SaTokenConfig 初始化成功！");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器，自定义认证规则
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 对 /admin/** 路径进行权限校验，同时兼容全局 context-path (/api)
            SaRouter.match("/admin/**", "/api/admin/**")
                    // 排除 OPTIONS 预检请求
                    .notMatchMethod("OPTIONS")
                    .check(r -> {
                        // 检查是否登录
                        StpUtil.checkLogin();
                        // 检查是否拥有管理员或超级管理员权限
                        ThrowUtils.throwIf(!StpUtil.hasRole("ROLE_ADMIN") && !StpUtil.hasRole("ROLE_SUPER_ADMIN"),
                                ErrorCode.NO_AUTH_ERROR, "无权限访问，需要管理员或超级管理员权限");
                    });
        })).addPathPatterns("/**")
            .excludePathPatterns(
                "/error",
                "/swagger-ui/**",
                "/v3/api-docs/**",
                "/doc.html",
                "/webjars/**"
            );
    }
}